package com.dl.base.api.websocket

import com.dl.base.api.websocket.bean.WebSocketInfo
import io.reactivex.rxjava3.core.Observable
import okio.ByteString
import java.util.concurrent.TimeUnit

interface WebSocketWorker {
    /**
     * 获取连接，并返回观察对象
     */
    operator fun get(url: String): Observable<WebSocketInfo>

    /**
     * 设置一个超时时间，在指定时间内如果没有收到消息，会尝试重连
     *
     * @param timeout  超时时间
     * @param timeUnit 超时时间单位
     */
    operator fun get(url: String, timeout: Long, timeUnit: TimeUnit?): Observable<WebSocketInfo>

    /**
     * 发送，url的WebSocket已打开的情况下使用，否则会抛出异常
     *
     * @param msg 消息，看具体和后端协商的格式，一般为json
     */
    fun send(url: String, msg: String): Observable<Boolean>

    /**
     * 发送，同上
     *
     * @param byteString 信息类型为ByteString
     */
    fun send(url: String?, byteString: ByteString?): Observable<Boolean>

    /**
     * 不关心WebSocket是否连接，直接发送
     */
    fun asyncSend(url: String, msg: String): Observable<Boolean>

    /**
     * 同上，只是消息类型为ByteString
     */
    fun asyncSend(url: String, byteString: ByteString): Observable<Boolean>

    /**
     * 关闭指定Url的连接
     */
    fun close(url: String): Observable<Boolean>

    /**
     * 马上关闭指定Url的连接
     */
    fun closeNow(url: String): Boolean

    /**
     * 马上关闭所有连接
     */
    fun closeAllNow()
}